/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.uoc.tfc.exuoc.vistes;

import edu.uoc.tfc.exuoc.config.Config;
import edu.uoc.tfc.exuoc.utils.Eines;
import edu.uoc.tfc.exuoc.utils.seguretat.InjeccioCodi;
import edu.uoc.tfc.exuoc.errors.ExisteixException;
import edu.uoc.tfc.exuoc.errors.NoActiuException;

import edu.uoc.tfc.exuoc.model.Sessio;
import edu.uoc.tfc.exuoc.controladors.GestorLogs ;
import edu.uoc.tfc.exuoc.controladors.GestorSessions;

import java.util.Map;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.SessionMap;
import javax.servlet.http.HttpServletRequest;

//import org.hibernate.HibernateException;

/**
 *
 * @author emoreno
 */
public class IGestorSessions extends ActionSupport {

    //Emili:20-10-11:private com.opensymphony.xwork2.util.logging.Logger log;
    private GestorLogs  log=GestorLogs .getLogger(this.getClass().getName());


    //Dades de login agafades del forumlari
    private String login="";
    private String contrasenya="";


    private Sessio sessio=null;

    private String idSessio;


    public IGestorSessions(){        }

// formulari de recollida d'identificacio
    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getContrasenya() {
        return contrasenya;
    }

    public void setContrasenya(String contrasenya) {
        this.contrasenya = contrasenya;
    }
/**Emili:16-10-2011:TODO
 * formulari de recollida d'identificacio
 * Per la creació de la sessió
 */
    public Sessio getSessio() {
        return sessio;
    }

    public void setSessio(Sessio sessio) {
        this.sessio = sessio;
    }

    public String getIdSessio() {
        return idSessio;
    }

    public void setIdSessio(String idSessio) {
        this.idSessio = idSessio;
    }


    public GestorLogs  getLog() {
        return log;
    }

    public void setLog(GestorLogs  log) {
        this.log = log;
    }

    @Override
    public String execute(){
        return ActionSupport.SUCCESS;
    }



    /**
     *
     * @return  success, si l'autenticació s'ha fet correctament i s'ha establert
     * un nou objecte sessio a la llista de sessions de GestorSessions
     *          input si no s'ha entrat correctament
     */

    public String login(){

        GestorSessions gs= new GestorSessions();

        InjeccioCodi filtre=new InjeccioCodi();
        String stat= ActionSupport.SUCCESS;

        //Si la sessio és correcta GestorSessions s'encarrega d'activar les
        //variables de sessió HTTP

        try {
            HttpServletRequest request = ServletActionContext.getRequest();
            Sessio s =gs.crear(filtre.netejar(request.getParameter("login").trim()),
                               filtre.netejar(request.getParameter("contrasenya").trim()));

            //this.getLog().info("IGestorSessions:Id de sessió:"+s.getId());
            this.setIdSessio(s.getId());
            //Limitem la sessió a 20 minuts, controlat per la classe Config
            request.getSession().setMaxInactiveInterval(Config.LIMITSESSIO);

        }catch (NullPointerException e){
            this.getLog().error("No s'ha creat la sessió, dades incorrectes ",e.getMessage());
            stat=ActionSupport.INPUT;
            this.addActionError("Falten dades o dades incorrectes");
        }catch (ExisteixException e){
            addActionError(e.getNomParam());
            stat=ActionSupport.INPUT;
            this.addActionError("usuari ja autenticat");
        }catch (NoActiuException e){
            stat=ActionSupport.INPUT;
            this.addActionError("usuari No actiu");
        }

        return stat;
    }

    //Mètode que es feia servir per les proves incials
    @Deprecated
    public String logout_vell(){

        Map sessioHTTP = ActionContext.getContext().getSession();

        String stat= ActionSupport.SUCCESS;

        this.setIdSessio(null);

        SessionMap s= new SessionMap(ServletActionContext.getRequest());

        s.invalidate();

        return stat;
    }
   public String logout(){

        Map sessioHTTP = ActionContext.getContext().getSession();

        String stat= ActionSupport.SUCCESS;
        GestorSessions gs= new GestorSessions();

        //TODO:24-11-2011:Emili: Cal fer, si s'escau, canviar la variable de
        //  sessio per la que hi ha a la classe IPrincipal => idSessio
        //if (! gs.eliminar(this.getIdSessio()))
        try {
            if (! gs.eliminar((String)sessioHTTP.get("idSessio"))){
                this.addActionError("Error en tancar la sessió.");
                this.addActionError("IdSessió: "+(String)sessioHTTP.get("idSessio"));
                stat=ActionSupport.ERROR;
            }
        }catch (NullPointerException e){
            this.getLog().error("IGestorSessions:S'han trobat valors nulls. "+e.getLocalizedMessage());
            
        }catch(IllegalStateException e){
            this.getLog().error("IGestorSessions: Accés erroni a les variables de sessió HTTP. "+e.getLocalizedMessage());
        }
        this.setIdSessio(null);
        return stat;
    }

 /**
  *
  * MAIN
  */
    public static void main(String[] args){

        Sessio s =null;
        IGestorSessions i = new IGestorSessions();
        Eines.escriu(i.login());
       // Eines.escriu(i.getIdSessio());
        Eines.escriu(i.logout());


    }
}
